home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
web
/
spiderweb
/
fixes-to-be-applied
/
latex
/
web.doc
(
.txt
)
< prev
next >
Wrap
LaTeX Document
|
1992-06-10
|
36KB
|
889 lines
\iffalse
%% Copyright D.Love, SERC Daresbury Laboratory, 1991
%% The `doc' version of this style is re-distributable and usuable
%% under conditions of the GNU copyleft, but please mark any changes,
%% list them here and report any major enhancements to the author.
% This is a self-documenting style. To produce the documentation you
% might use a driver file like this:
% \def\webmacs{null} \documentstyle[a4,makeidx,newdoc,web]{article}
% \EnableCrossrefs \CodelineIndex
% \begin{document} \DocInput{web.sty} \PrintIndex
% \end{document}
% and run `makeindex -s gind.ist doc' in between passes. You need
% Mittelbach's newdoc.sty at v1.6d or later.
% To produce the .sty file use `latex docstrip' to remove most of the
% comments. Please don't distribute the .sty file without the .doc
% file.
\iffalse % hack RCS info into a sensible form:
\def\next$#1: #2/#3/#4 #5 ${\def\filedate{#4/#3/#2}\def\filetime{#5}}
\next$Date: 91/03/06 15:27:01 $
\def\next$#1: #2 ${\def\fileversion{#2}}
\next$Revision: 1.3 $
% \title{A a \web{} style file for \LaTeX{}\thanks{This file is version
% \fileversion\ of \filedate}}
% \author{David Love\\[2ex]{\it SERC Daresbury Laboratory, Warrington
% WA4 4AD, UK}\\ \tt d.love@daresbury.ac.uk}
% \date{}
% \newcommand{\web}{{\tt WEB}}
% \newcommand{\weave}{{\tt WEAVE}}
% \newcommand{\tangle}{{\tt tangle}}
% \newcommand{\spider}{Spider}
% \MakeShortVerb{\"}
% \DoNotIndex{\/,\@date,\@ifundefined,\@makefnmark,\@starttoc}
% \DoNotIndex{\@topnum,\addpenalty,addvspace,\advance,aftergroup}
% \DoNotIndex{\begin,\begingroup,\bgroup,\char,\def,\egroup,\else,\end}
% \DoNotIndex{\endgroup,\fi,\fnsymbol,\hfil,\hfill,\hfilneg,\hss,\kern}
% \DoNotIndex{\let,\lineskip,\newcommand,\protect,\qquad,\quad,\relax}
% \DoNotIndex{\thanks,\thefootnote,\z@,\@M,\@thanks,\@thefnmark,\hbox}
% \DoNotIndex{\empty,\mbox}
% \maketitle
% \begin{abstract} \noindent
% This style file is for use with a version of the Spidery \weave\ system
% that has been adapted to use \LaTeX\ rather than plain \TeX\ for the
% formatting. It is a first attempt.
% \end{abstract}
% \section{Assumptions of \weave{} and the {\tt .web} file}
% We assume we're using the version of Spidery \weave{} \cite{spider}
% changed for \LaTeX\@. This will write out
% \begin{quote}"\def\webmacs{"\meta{ext}"web.tex}",\end{quote}
% (where \meta{ext} is
% the \spider{} {\tt extension}), then the limbo section, then
% \begin{quote}"\begin{document}\maketitle" \end{quote}
% the latter to stop you forgetting it. The "\webmacs" file will be
% included at the end of this style.
% After the index (if any), we get
% "\end{document}". The user thus has to put the "\documentstyle"
% command in the limbo part and include "web" in the style options to
% get this stuff and can use other options as appropriate. You're
% meant to use the "article" main style, although I think "report"
% would work too.
% \section{Strategy}
% The idea was to change the original \spider{} \TeX{} stuff as little
% as possible, although it has actually been changed quite
% substantially. Changes are forced where there is a clash of macro
% names; most of the original one-character control sequences are
% already used by \LaTeX, for instance. Some features have been
% converted to a \LaTeX{} equivalent,
% notably the table of contents mechanism, the title page, running
% header and double-columning for the index. For safety, "\def"s have
% been replaced by "\newcommands" where possible since there are
% probably plenty of possibilities for name clashes.
% User-visible differences from the plain version are given in
% appendix~\ref{changes}.
% \section{Use with old webs}
% Examples of the use of this style with old webs using the plain
% conventions can be found in the accompanying changes files for
% {\tt weave.web} and {\tt spider.web}. You can use the limbo section
% to check whether the generated ".tex" file is being run through
% \LaTeX\ or plain \TeX\ by doing something like this:
% \begin{quote}
% \begin{verbatim}
% \ifx\enddocument\undefined
% % plain things
% \else
% % LaTeX things
% \fi
% \end{verbatim}
% \end{quote}
% \section{Bugs}
% Floats
% don't always come out where you'd expect due to interaction with
% \web's attempts to keep all of a module on one page if possible.
% "\str" and "\vstr", which
% might well get used in a moving argument, are
% fragile. Module titles (after "@*") are moving arguments. I think
% if you use \web's "|"\dots"|" construction in a
% moving argument it will break and there's not much you can do about
% it.
% \section{Code}
% \subsection{Preliminaries --- page layout}
% Let's announce ourselves as usual:
% \begin{macrocode}
\typeout{Sub-style `web', version \fileversion\space of \filedate}
% \end{macrocode}
% We don't want stretch between paragraphs.
% \begin{macrocode}
\parskip \z@
% \end{macrocode}
% \begin{macro}{\textwidth}\begin{macro}{\textheight}
% \begin{macro}{\oddsidemargin} \begin{macro}{\evensidemargin}
% The default page width should be large for \web\@. This is for
% non-Americans (A4)---if you want to alter the page dimensions with a
% suitable style option put it {\em after\/} "web" in the
% "\documentstyle" list. The width here is too big for decently
% readable text, but is
% still less than the $6.5''$ of the original. Note that there's no
% point in trying to use "\marginpar" at
% this width since the margins have disappeared! The "twoside" option
% will work sensibly if you care to use it.\DescribeMacro{twoside} We
% want to avoid doing this when typesetting the documenttation, hence
% the test for "\DocInput".
% \begin{macrocode}
\ifx\DocInput\undefined
\ifcase \@ptsize
\textheight = 53 \baselineskip
\textheight = 47 \baselineskip
\textheight = 43 \baselineskip
\fi \advance \textheight by \topskip
\textwidth=6.27in \oddsidemargin=\z@ \evensidemargin=\z@
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}
% We use the "myheadings" page style with headings containing section
% information (see below).
% \begin{macrocode}
\pagestyle{myheadings}
% \end{macrocode}
% If we start off with a "\sectionmark" we won't miss the running
% header off the first page where it should appear.
% \begin{macrocode}
\ifx\DocInput\undefined \sectionmark{1} \fi
% \end{macrocode}
% \subsubsection{Font selection}
% \begin{macro}{\normal@font}
% We have to check whether we're in the old or new font selection scheme
% and set up appropriately. "\normal@font" is invoked before the font
% changes for identifiers, reserved words and strings to make sure
% that they use the default series and shape in the new scheme. This
% is actually only necessary if "\id", "\res" or "\str" is used in
% \TeX\ text that is being set in a different shape or series, not
% normally in the code. If you use the new selection scheme you can
% do things like using Concrete or PostScript fonts easily.
% \begin{macrocode}
\@ifundefined{selectfont}{%
\let\normal@font=\relax} % old scheme
{% new scheme
\def\normal@font{\series \mediumseriesdefault
\shape \normalshapedefault}}
% \end{macrocode}
% \end{macro}
% \subsection{Front matter}
% We depart from the plain version here. The first page (or pages, if
% the contents are very long) is produced with the "titlepage"
% environment. The "\author", "\date" and
% "\title" \DescribeMacro{\title} can be specified
% as usual in \LaTeX\@. Note that you now say
% "\title{"\meta{title}"}" rather than "\def\title{"\meta{title}"}" as
% in the plain version and this title will be used in the running
% header.
% \begin{macro}{\@maketitle}
% We'll re-define "\@maketitle" to include the "\topofcontents" and
% "\botofcontents" information, with the contents information in the
% middle. The normal title, author and date will be put automatically
% at the top---"\topofcontents" is extra. You get the titling and
% contents information automatically, since "\maketitle" is inserted
% by \weave{} immediately after "\begin{document}". If you want to
% suppress it, "\let\maketitle=\relax" in the limbo part.
% Of course, you have to make two
% passes to get the contents printed, unlike the original plain
% system. This should not be much hardship as one usually reckons on
% running \LaTeX{} at least twice. (Putting the titlepage at the back
% won't help, since the ".toc" file only exists after the ".aux" file
% has been read on the secind pass. One could change the standard
% behaviour so that the ".toc" file was created at the end of the
% first pass, I guess.)
% We first test for "\DocInput" as above to
% avoid messing things up when typesetting the documentation.
% \begin{macrocode}
\ifx\DocInput\undefined
\def\@maketitle{%
\newpage \thispagestyle{empty} \null
\begin{center}
{\LARGE \@title \par} \vskip 1.5em
{\large \lineskip .5em
\begin{tabular}[t]{c} \@author \end{tabular} \par}
\vskip 1em {\large \@date}
\end{center}
\par \vskip 1.5em
\topofcontents \tableofcontents \par \botofcontents \newpage }
% \end{macrocode}
% \end{macro}
% \begin{macro}{\maketitle}
% We change "\maketitle" to avoid the "\thispagestyle{plain}" that it
% otherwise contains, to set the page number to 1 at the end and to
% avoid losing the definitions of "\@title" and "\@author".
% ("\@title" is used in the running header.)
% \begin{macrocode}
\ifx\DocInput\undefined
\def\maketitle{%
\par \begingroup
\def\thefootnote{\fnsymbol{footnote}}
\def\@makefnmark{\hbox to \z@ {$^{\@thefnmark}$\hss}}
\if@twocolumn \twocolumn[\@maketitle]
\else \newpage \global\@topnum\z@ \@maketitle \fi
\@thanks
\endgroup
\setcounter{footnote}{0} \setcounter{page}{1}
\let\maketitle\relax \let\@maketitle\relax
\gdef\@thanks{}\let\thanks\relax}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\@title} \begin{macro}{\@author}
% We better define these in case they're not supplied:
% \begin{macrocode}
\let\@title=\empty \let\@author=\empty
% \end{macrocode}
% \end{macro} \end{macro}
% \begin{macro}{\tableofcontents}
% "\tableofcontents" is re-defined to produce a header saying
% ``Section'' and ``Page'' a bit like the plain version, although the
% section number is at the left.
% \begin{macrocode}
\def\tableofcontents{%
\noindent Section \hfill Page \par \@starttoc{toc}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\topofcontents} \begin{macro}{\botofcontents}
% The "\topofcontents" material that comes between the title\slash author
% information and the contents list and the "\botofcontents" stuff
% that comes after the contents list are empty initially. I'm not
% sure it's worth preserving them.
% \begin{macrocode}
\def\topofcontents{} \def\botofcontents{}
% \end{macrocode}
% \end{macro} \end{macro}
% \begin{macro}{\ttitlefont} \begin{macro}{\titlefont}
% These are just for compatibility with the plain version---they
% should probably go.
% \begin{macrocode}
\let\ttitlefont=\tt \let\titlefont=\rm
% \end{macrocode}
% \end{macro} \end{macro}
% \subsection{Prettyprinting stuff}
% \subsubsection{Identifiers, reserved words and strings}
% \begin{macro}{\id}\begin{macro}{\ida}\begin{macro}{\idfont}
% Multi-letter identifiers are set by the macro "\id" in font "\idfont",
% which is italic by default i.e., \id{identifier}.
% One-letter identifiers are
% actually set by "\ida" in math italic as they are supposed to look
% better that way (\ida{a} rather than \id{a}).
% \begin{macrocode}
\newcommand{\id}[1]{\mbox{\idfont #1\/\kern.05em}}
\newcommand{\ida}[1]{\mbox{$ #1 $}}
\newcommand{\idfont}{\normal@font \it}
% \end{macrocode}
% \end{macro} \end{macro} \end{macro}
% \begin{macro}{\reservedfont}\begin{macro}{\res}
% Reserved words are set by macro "\res", using "\reservedfont" which
% is bold by default i.e., \res{reserved}.
% \begin{macrocode}
\newcommand{\reservedfont}{\normal@font \bf}
\newcommand{\res}[1]{\mbox{\reservedfont#1\/}}
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\str}
% Typewriter type is used for strings, set by "\str" i.e.,
% \str{string}. The definitions of the escaped characters
% are given below. I don't understand why the ampersand is treated
% like this, since "\&" is defined anyway, but quotes and "^" are
% escaped to avoid
% ligatures.\footnote{{\tt \char`\^} and {\tt \char`\~} form ligatures
% in PostScript virtual fonts as well as "'".} It's necessary to do a
% "\def" of "\^" rather than just
% "\let\^\CF" to avoid an error with the use of "\^" not matching its
% definition. Note the use of "\@tempa" below rather than "\XX" as
% used in the same situation elsewhere---using "\XX", "\str" breaks if
% it is used in, say, a comment.
% \begin{macrocode}
\def\str#1{%
\ifmmode \gdef\@tempa{\null$\null}\else \gdef\@tempa{}\fi
\@tempa {%
\let\\=\BS \let\'=\RQ \let\`=\LQ \let\{=\LB \let\}=\RB
\let\~=\TL \let\ =\SP \let\&=\AM \def\^{{\tt \char`\^}}%
\leavevmode \normal@font\tt #1}\@tempa}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\AM} \begin{macro}{\BS} \begin{macro}{\LB}
% \begin{macro}{\LQ} \begin{macro}{\RB} \begin{macro}{\UL}
% \begin{macro}{\TL}
% Here are the definitions of the control sequences for strings. The
% plain version redefined "\#", "\$", "\%" and "\^" globally. "\$"
% isn't used by awk or C \web s, and has been removed. The others are
% done only in code, using "\startcodehook" (below).
% \begin{macrocode}
\chardef\AM=`\& % ampersand
\chardef\BS=`\\ % backslash
\chardef\LB=`\{ % left brace
\def\LQ{{\tt\char'22}} % left quote
\chardef\RB=`\} % right brace
\def\RQ{{\tt\char'23}} % right quote
\def\UL{{\tt\char`\_}} % underline character in a string
\def\TL{{\tt\char`\~}} % tilde
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
% \end{macro}
% \begin{macro}{\SP}
% Strings may be rather long and we want some way of breaking
% them, so
% "\SP" produces a visible space (\str{\SP}) and also adds a discretionary
% break afterwords. If a break occurs, the line is ended with a
% backslash. Spaces are probably the most sensible place to break
% strings, especially if they are messages, but one could consider
% doing the same thing for other of the macros above e.g., "\BS" might
% check if the next character was "n" and insert a discretionary break
% after that.
% \begin{macrocode}
\newcommand{\SP}{\char`\ \discretionary{\hbox{\char`\\}}{}{}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\vstr}
% This does a verbatim string (from "@=") using the existing \LaTeX
% nology rather than the original definition to put a frame around it
% (\vstr{string}).
% \begin{macrocode}
\newcommand{\vstr}[1]{\kern 2pt \fbox{\str{#1}}\kern 2pt}
\setlength{\fboxsep}{2pt}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\const}
% This looks after setting octal, hex or decimal constants. The first
% thing in its argument may be one of the control sequences in the
% example on the left,
% producing the result in the middle:
% \[\begin{tabular}{lll}
% "\const{\$10}" & $\const{\$10}$ & (long) \\
% "\const{\_10}" & $\const{\_10}$ & (power of ten)\\
% "\const{\~10}" & $\const{\~10}$ & (octal) \\
% "\const{\^AB10}" & $\const{\^AB10}$ & (hex) \\
% \end{tabular}\]
% \DeleteShortVerb{\"}
% \begin{macrocode}
\def\const#1{{%
\def\?{\kern.2em}%
\def\${\ell}% long
\def\_{\RealConstFormat{\aftergroup}}% power of ten
\def\~{\hbox{\rm \char'23\kern-.2em \it \aftergroup\?\aftergroup}}% octal
% \end{macrocode}
% The \verb+"+ here was originally \verb+\char'175+ which,
% unfortunately, is different in PostScript virtual fonts and Computer
% Modern:
% \begin{macrocode}
\def\^{\hbox{\rm "\tt \aftergroup}}% hex
#1}} % (\def{\const})
% \end{macrocode}
% \end{macro}
% \MakeShortVerb{\"}
% \begin{macro}{\RealConstFormat}
% I prefer to re-define the decimal style
% to print as the more code-like `$\mbox{\rm e}10$'. You can
% do this by using the hook "\RealConstFormat" in your Spider "macros"
% section:
% \begin{quote} "\newcommand{\RealConstFormat}{\mbox{\rm e}}" .\end{quote}
% For a go at a Fortran web, I hacked the lexing so that an "e" or "d" in
% a real or double-precision constant was transmitted verbatim into the
% argument of "\const" instead of "\_" and re-defined "\const" to ensure
% this was set in roman.
% \begin{macrocode}
\newcommand{\RealConstFormat}{\cdot 10^}
% \end{macrocode}
% \end{macro}
% \subsubsection{Indentation and breaks}
% \begin{macro}{\ind}
% This counter stores the current indentation in ems.
% \begin{macrocode}
\newcount\ind
% \end{macrocode}
% \end{macro}
% \begin{macro}{\bak} \begin{macro}{\bakk}
% These backspace one and two ems respectively.
% \begin{macrocode}
\newbox\bak \setbox\bak=\hbox to \m@ne em{}
\newbox\bakk \setbox\bakk=\hbox to -2em{}
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\0}
% A forced break, as from "@/":
% \begin{macrocode}
\def\0{%
\ifmmode
\ifinner$\par\hangindent\ind em\noindent\kern\ind em\ignorespaces$\fi
\else
\par\hangindent\ind em\noindent \kern\ind em\ignorespaces
\fi}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\1}
% Indent one more notch:
% \begin{macrocode}
\newcommand{\1}{\global\advance\ind by 1 \hangindent\ind em}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\2}
% Indent one less notch:
% \begin{macrocode}
\newcommand{\2}{\global\advance\ind by \m@ne }
% \end{macrocode}
% \end{macro}
% \begin{macro}{\3}
% An optional break within a statement, as from "@|":
% \begin{macrocode}
\newcommand{\3}[1]{\hfil \penalty#10 \hfilneg}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\4}
% Backspace one notch:
% \begin{macrocode}
\newcommand{\4}{\copy\bak}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\5}
% Optional break:
% \begin{macrocode}
\newcommand{\5}{\hfil \penalty \m@ne \hfilneg \kern 2.5em \copy\bakk
\ignorespaces}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\6}
% A forced break with no indentation:
% \begin{macrocode}
\def\6{\ifmmode \else \par
\hangindent\ind em\startline \ignorespaces \fi}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\startline}
% This is used by "\code" as well as "\6" above.
% \begin{macrocode}
\def\startline{\noindent \count255=\ind \advance\count255 by -2
\hskip\count255 em}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\7}
% A forced break and a little extra vertical space, as from "@#":
% \begin{macrocode}
\newcommand{\7}{\Y\6}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\8}
% No indentation. It works only in code, not in "|"\dots"|".
% \begin{macrocode}
\newcommand{\8}{\unskip}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\J}
% \tangle's join operation ("@&"):
% \begin{macrocode}
\newcommand{\J}{\str{@\&}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\C}
% This looks after comments. The hooks are inserted because comments
% aren't code (see below).
% \begin{macrocode}
\def\C#1{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi
\XX \hfil \penalty \m@ne\hfilneg\quad % original spider
$\commentbegin\,$\endcodehook{#1}\startcodehook$\,
\commentend$\XX}
% \end{macrocode}
% \end{macro}
% \subsection{Modules}
% \begin{macro}{\onmaybe} \begin{macro}{\maybe} \begin{macro}{\ifon}
% These switches are concerned with only printing changed sections if
% so desired.
% \begin{macrocode}
\def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue \newif\ifon
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
% \begin{macro}{\M}
% Beginning of an un-starred section:
% \begin{macrocode}
\outer\def\M#1.{%
\MN#1.\ifon\vfil\penalty-100\vfilneg
\vskip12ptminus3pt \startsection \ignorespaces}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\startsection} \begin{macro}{\lapstar}
% Some auxilliary definitions:
% \begin{macrocode}
\def\startsection{\Q \noindent {\let\*=\lapstar \bf \modstar.\quad }}
\newcommand{\lapstar}{\rlap{*}}
% \end{macrocode}
% \end{macro} \end{macro}
% \begin{macro}{\N}
% This introduces a starred section (where "#2" is the title). We
% have to check the title with "\headcheck" for a leading
% character indicating a subsection. Then we write a contents entry,
% change the running header and set the title in bold. "\old@S" is
% used in the header rather than "\S" since "\S" is probably
% wrongly-defined at this point (see below).
% \begin{macrocode}
\outer\def\N#1.#2.{%
\MN#1.\headcheck#2\headcheck
\typeout{*\modno} % progress report
\addcontentsline{toc}{\headcheck@type}
{\hbox to 2em{\modno\hfill} \quad \theopen \relax \themodtitle}
\markboth{% running headline
{\protect\small \qquad\uppercase{\ignorespaces\themodtitle}}
\hfill {\protect\small \@title}\qquad{\rm \old@S \modno}}
{\rm \old@S \modno\qquad {\protect\small \@title}\hfill
{\protect\small \uppercase{\ignorespaces\themodtitle\qquad}}}
\ifon\startsection {\bf \ignorespaces \themodtitle.\quad }\ignorespaces}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\MN}
% Here is some common code for "\M" and "\N"\@. Like the normal \LaTeX{}
% "\section", it looks after setting a
% "\sectionmark" and advancing the section counter using
% "\refstepcounter" so that it can be cross-referenced as usual. It
% looks after the decision about whether or not to set this module if it
% is not starred.
% \begin{macrocode}
\def\MN#1.{%
\par {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}%
\ifx\modno\modstar \onmaybe \else \ontrue \fi
\sectionmark{\modno} \refstepcounter{section}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\note} \begin{macro}{\A}
% Auxilliary macros. "\A" is for cross-references for multiply
% defined section names.
% \begin{macrocode}
\def\note#1#2.{\Y \noindent {\hangindent 2em \footnotesize
\baselineskip 10pt#1 #2.\par}}
\newcommand{\A}{\note{See also}}
% \end{macrocode}
% \end{macro} \end{macro}
% \subsubsection{Processing special section headings}
% This complicated stuff, introduced with \spider{} and modified for the
% \LaTeX{} version, is to allow an inital =, 1, 2, 3 or 4 in
% starred module titles to indicate a hierarchy. Their effect is as follows:
% \[ \begin{tabular}{c|c|c}
% Introduction & Page eject? & Indentation in contents\\ \hline
% "@*=" & yes & 0 \\
% "@*1" & yes & 2 em \\
% "@*2" & no & 2 em \\
% "@*3" & yes & 4 em \\
% "@*4" & no & 4 em \\
% \end{tabular} \]
% "@*=" also suppresses a following page eject and emboldens the
% table of contents entry and puts some extra vertical space before
% it. Normal starred sections have no indentation in the contents and
% don't do anything special about page breaks.
% \begin{macro}{\l@part} \begin{macro}{\l@norm} \begin{macro}{\l@num}
% Two new sorts of contents entry are defined here and the `part'
% type re-defined. (See "latex.tex" for details of how this works.)
% "\l@part" determines the t.o.c.\ entry for a "@*=" section,
% "\l@norm" the entry for a normal starred section and "\l@num" that
% for a numbered section. Some penalties are inserted (the normal
% values for the main style) in case the t.o.c.\ extends over more
% than one page. The "\headcheck@type" definition is used in the
% sectioning commands to write the t.o.c.\ entry.
% \begin{macrocode}
\def\l@part{\addpenalty{\@secpenalty}
\addvspace{3pt plus 1pt} % space above part line
\@dottedtocline{0}{\z@ }{4em}}
\def\l@norm{\addpenalty{\@secpenalty}
\@dottedtocline{0}{\z@ }{4em}}
\def\l@num{\@dottedtocline{0}{0em}{4em}}
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
% \begin{macro}{\ifcancel} \begin{macro}{\ifnextchar}
% \begin{macro}{\ifnch} \begin{macro}{\makethechar}
% Here's the tricky stuff, presented without further comment!
% \begin{macrocode}
\newif\ifcancel \cancelfalse
\def\ifnextchar#1#2#3{%
\let\@tempe=#1\def\@tempa{#2}\def\@tempb{#3}\@ifnch}
\def\@ifnch{%
\ifx \@tempc \@tempe\let\@tempd\@tempa
\else \let\@tempd\@tempb
\fi
\@tempd}
\def\makethechar#1{\let\@tempc=#1}
% \end{macrocode}
% \end{macro} \end{macro} \end{macro} \end{macro}
% \begin{macro}{\headcheck}
% \begin{macrocode}
\def\headcheck#1#2\headcheck{%
\makethechar{#1}%
\def\theskipper{\vfil\penalty-100 % skip before new module
\vfilneg\vskip12ptminus3pt}%
\def\theopen{}% opening skip in toc entry
\def\thetocskip{}% vertical skip before toc entry
\def\themodtitle{{#2}}%
\def\headcheck@type{num}%
\ifnextchar={%
\def\theskipper{\newpage} \canceltrue
\def\headcheck@type{part} \def\theopen{\bf}%
\def\thetocskip{\vskip 3pt plus 1in \penalty-100
\vskip \z@ plus -1in}%
}{\ifnextchar1{%
\cancelfalse \def\theskipper{\newpage}%
\def\theopen{\hskip2em}%
}{\ifnextchar2{%
\cancelfalse \def\theopen{\hskip2em}%
}{\ifnextchar3{%
\cancelfalse \def\theskipper{\newpage}%
\def\theopen{\hskip4em}%
}{\ifnextchar4{%
\cancelfalse \def\theopen{\hskip4em}%
}{% else
\ifcancel\else \def\theskipper{\newpage}\fi
\cancelfalse \def\headcheck@type{norm}%
\def\themodtitle{#1{#2}}%
}}}}}%
\theskipper }
% \end{macrocode}
% \end{macro}
% \subsubsection{Starting and ending code sections}
% \begin{macro}{\code}
% This takes us into code mode. The old version used infinite hyphen
% penalty which stopped the discretionary breaks in strings. Extra
% space is put after ";" with the "\sfcode".
% \begin{macrocode}
\newcommand{\code}{%
\rightskip=\z@ plus 100pt minus 10pt
\sfcode`;=3000 \pretolerance \@M
\hyphenpenalty 9999 \exhyphenpenalty \@M
\global\ind=2 \1 \startline
% \end{macrocode}
% \DescribeMacro{\@}
% The original says that every web must define "\?", where "?" is the
% at-sign. Since "\@" is used for end-of-sentence space in \LaTeX, we
% make sure this is only done in code mode. We need the old and new
% definitions, "\old@" and "\code@", between which to switch.
% \spider{} unfortunately uses "\S" instead of "\equiv" and the awk
% and C \web s assume that "\%" and "\#" translate to typewriter
% versions, so we have to define these properly in code mode too.
% \DescribeMacro{\startcodehook} \DescribeMacro{\endcodehook}
% For convenience, we define token registers
% "\startcodehook" and "\endcodehook" for this sort of purpose when we
% go into and out of code mode. These might be altered by the
% \spider\ description if appropriate.
% \begin{macrocode}
\startcodehook} % \def\code
% \end{macrocode}
% \end{macro}
% \begin{macro}{\old@}\begin{macro}{\code@}\begin{macro}{\old@S}
% \begin{macro}{\old@percent} \begin{macro}{\old@hash}
% Let's store the original definitions of these:
% \begin{macrocode}
\let\old@=\@ \let\old@S=\S \let\old@percent=\%
\let\old@hash=\#
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
% \begin{macro}{\code@}\begin{macro}{\tt@percent}\begin{macro}{\tt@hash}
% And here are replacements for use in code mode.
% \begin{macrocode}
\chardef\code@=`\@
\def\tt@percent{\hbox{\tt\char`\%}} \def\tt@hash{\hbox{\tt\char`\#}}
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
% \begin{macro}{\startcodehook}\begin{macro}{\endcodehook}
% Here are the hooks. Should these be token registers?
% \begin{macrocode}
\def\startcodehook{\let\@=\code@ \let\S=\equiv \let\%=\tt@percent
\let\#=\tt@hash \def\^{\hbox{\tt\char`\^}}}
\def\endcodehook{\let\@=\old@ \let\S=\old@S \let\%=\old@percent
\let\#=\old@hash \def\^##1{{\accent94 ##1}}}
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\Q}
% This gets us out of code mode, setting things back to normal.
% \begin{macrocode}
\def\Q{\rightskip=\z@ \sfcode`;=1500 \pretolerance 200
\endcodehook}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\CD} \begin{macro}{\DC}
% Web text in "|"\dots"|" is woven into text surrounded by
% "\CD"\dots"\DC"\@. The original definition didn't bother with the
% grouping if not in math mode, but it's convenient now that the hooks
% need to be added.
% \begin{macrocode}
\def\DC{\endcodehook \egroup}
\def\CD{\relax
\ifmmode \hbox\fi \bgroup \startcodehook}
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\U}
% This provides a cross-reference for uses of sections.
% \begin{macrocode}
\newcommand{\U}{\note{This code is used in}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\X}
% This does modules which introduce the code. Note the usage:
% "\X"\meta{module number}":"\meta{module name}"\X".
% \begin{macrocode}
\def\X#1:#2\X{%
\ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi
\XX$\langle\,$#2{\footnotesize \kern.5em #1}$\,\rangle$\XX }
% \end{macrocode}
% \end{macro}
% \begin{macro}{\XF}
% This is for a file module (from "@("):
% \begin{macrocode}
\def\XF#1:#2\XF{%
\ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi
\XX {\tt (#2{\footnotesize \kern.5em #1})}\XX}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\Y} \begin{macro}{\yskip}
% This does a vertical skip by "\yskip", used in "\note" and "\7".
% \begin{macrocode}
\newcommand{\Y}{\par\yskip}
\let\yskip=\smallskip
% \end{macrocode}
% \end{macro}\end{macro}
%
% \subsection{Definitions and formats}
% \begin{macro}{\D} \begin{macro}{\F} \begin{macro}{\defin}
% "\D" and "\F" deal with macro and format definitions from "@d" and
% "@f" respectively.
% \begin{macrocode}
\newcommand{\D}{\defin{define}} % macro definition
\newcommand{\F}{\defin{format}} % format definition
\newcommand{\defin}[1]{\global\advance\ind by 2 \1\res{#1 }}
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
% \subsection{Miscellaneous symbols}
% \begin{macro}{\DO} \begin{macro}{\G} \begin{macro}{\I}
% \begin{macro}{\K} \begin{macro}{\L} \begin{macro}{\R}
% \begin{macro}{\TI} \begin{macro}{\V} \begin{macro}{\W}
% Here are some miscellaneous symbols. I think these should really be
% defined in the \spider\ descriptions that need them, but they are
% assumed by the current webs.
% \begin{macrocode}
\newcommand{\DO}{\hbox{\sl\char'044}} % slant dollar sign (used by awkweb)
\let\G=\ge % greater than or equal sign
\let\I=\ne % unequal sign
\let\K=\gets % left arrow
\let\L=\le % less than or equal sign
\let\R=\lnot % logical not
\let\TI=\sim % tilde
\let\V=\lor % logical or
\let\W=\land % logical and
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
% \end{macro}\end{macro}\end{macro}
% \begin{macro}{\vert} \begin{macro}{\amp} \begin{macro}{\PP}
% \begin{macro}{\*}
% And some more: (n.b., the plain \TeX{} definitions of "\vert"
% and "\*" are over-written, as expected by spidery \weave---maybe this
% should be changed).
% \begin{macrocode}
\def\vert{|} \let\amp=\& \let\PP=\P \let\*=*
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}
% \begin{macro}{\AT}
% This is the `at sign in control
% text'. In the plain version it says "\def\AT!{@}" which I presume
% is a mistake.
% \begin{macrocode}
\def\AT{@}
% \end{macrocode}
% \end{macro}
% \subsection{Indexing}
% \begin{macro}{\ch}
% This is used trivially at the start of the index in the case of
% changes:
% \begin{macrocode}
\def\ch{\note{The following sections were changed by the change file:}
\let\*=\relax}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\inx} \begin{macro}{\:}
% The index is set in two-column mode.
% Each item in each index is introduced by "\:". This is a \LaTeX{}
% macro but is unlikely to get used in the index and so is preserved
% from the original.
% \begin{macrocode}
\def\inx{%
\typeout{Index:}
\begin{multicols}{2}
\parskip \z@ plus .5pt
\parfillskip \z@ plus .6\hsize % try to avoid almost empty lines
\outer\def\:##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry
\rm \tolerance \@M \let\*=\lapstar
\hyphenpenalty \@M \parindent=\z@ }
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\fin}
% This finishes off the name index and starts off the module index.
% "\:" acts as in "\inx". The modules may be
% qualified with "\U", which cross-references section uses. The page
% header is changed appropriately.
% \begin{macrocode}
\def\fin{%
\end{multicols} \newpage
\parfillskip \z@ plus 1fil
\markboth{{\protect\small NAMES OF THE SECTIONS}\hfill
{\protect\small\@title}}
{{\protect\small\@title}\hfill
{\protect\small NAMES OF THE SECTIONS}}
\typeout{Section names:}
\def\note##1##2.{\quad{\footnotesize##1 ##2.}}
\def\U{\note{Used in}}%
\def\:{\par\hangindent 2em}\let\*=*}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\con}
% This finishes everything off, rather trivially. (It used to make
% the contents page.)
% \begin{macrocode}
\newcommand{\con}{\end{document}}
% \end{macrocode}
% \end{macro}
% \subsection{Including other files}
% \DescribeEnv{multicols}
% We need the {\tt multicols} environment to make a two-column index
% without a forced page break.
% \begin{macrocode}
\input{multicol.sty}
% \end{macrocode}
% \DescribeMacro{\webmacs}
% Finally we include the macros defined by \spider. Doing things this way
% means that \spider{} can override things done in this file for the
% \web{} system of a particular language (like the
% definition of "\res", for instance) and the limbo section can do
% further overriding for a particular web file. If we're using this
% file to document itself, "\webmacs" should have been defined in the
% driver file to be "null"!
% \begin{macrocode}
\input{\webmacs}
% \end{macrocode}
% "\webmacs" is no further use and we might as well save the space.
% \begin{macrocode}
\let\webmacs=\empty
% \end{macrocode}
% \appendix
% \section{Changes from the plain version}\label{changes}
% \begin{description}
% \item[{\tt \BS.}] becomes "\str";
% \item[{\tt \BS\char`\^}] has been removed from the global
% definitions (where it was assumed by the "c.spider" translation for
% "^") and put in limbo in "weave.ch";
% \item[{\tt \BS\%}, {\tt \BS\#} and {\tt \BS\$}] also removed from global
% definitions and put in "\startcodehook";
% \item[{\tt \BS AT!}] becomes "\AT" on the assumption that
% the original was an error;
% \item[{\tt \BS\char`\~}] removed globally since it doesn't seem to be used;
% \item[{\tt \BS\BS} and {\tt \BS|}] become "\id" and "\ida" respectively;
% \item[{\tt \BS\&}] becomes "\res";
% \item[{\tt \BS B} and {\tt \BS T}] (for controlled comments) removed
% since no controlled comments in \spider;
% \item[{\tt \BS)}] (string pool check sum) removed;
% \item[{\tt \BS]}] (sign for forced line break) appears not be be
% used, so removed;
% \item[{\tt \BS=}] becomes "\vstr";
% \item[{\tt \BS H}] (hat) removed since it seems not to be used and
% clashes with \LaTeX;
% \item[{\tt \BS Z}] replaced by \LaTeX{} contents stuff;
% \item[{\tt \BS lheader} and {\tt \BS rheader}] replaced by \LaTeX{} marks;
% \item[output routine stuff] all gone;
% \item[{\tt \BS rhead}] no longer relevant---use the \LaTeX{} mark
% mechanism;
% \item[{\tt \BS title}] should be called as a macro with the title as
% its argument rather than "\def"ed;
% \item[{\tt \BS contentspagenumber}, {\tt \BS contentsfile} and {\tt
% \BS readcontents}] no longer relevant;
% \item[{\tt \BS pagewidth}, {\tt \BS pageheight} and {\tt \BS
% fullpageheight}] no longer relevant---use the \LaTeX\ equivalents;
% \item[{\tt \BS pageshift}] no longer relevant---use "twoside" option;
% \item[verbatim macros] no longer relevant;
% \item[{\tt \BS iftitle}] removed---use "\pagestyle{empty}" to
% suppress page header.
% \end{description}
% \begin{thebibliography}{1}
% \bibitem{spider} N. Ramsey, {\sl Comm. ACM}, {\bf 32} (1989) 1051
% \end{thebibliography}